import hashlib
import math

#类名需要以大写开头，使用驼峰命名法
class Person(object):
    # def __new__(cls, *args, **kwargs):
    #     #继承父类的new方法，返回一个实例
    #     print("我是new方法，是在实例创建之前被调用的，他的任务就是返回的是self的内存地址")
    #     print("我是new方法创建出来的对象"+str(id(super().__new__(cls))))
    #     return super().__new__(cls)

    ABCD = "xxxxx"


    # #所有的给属性赋值操作，都写在init里
    def __init__(self, name, sex):
        #print("我是构造方法，是当实例被创建完成之后调用的，然后设置对象属性")
        #print("我是init里的self"+str(id(self)))
        self._name = name
        self._age = 0
        self._sex = sex

    @property
    def sex(self):
        return self._sex

    @staticmethod
    def xiaodu(level):
        print("xiaodu level:%s" % level)

    @classmethod
    def chifan(cls):
        pass

    def set_age(self, age):
        self.age = age

    #方法每次被调用时，解析器都会自动船底第一个实参self（叫什么无所谓）,就是调用这个方法对象本身
    def washing_clothes(self, clothes):
        print("%s拿出了脏%s" % (self.name, clothes))
        print("%s倒洗衣液，开始洗%s" % (self.name, clothes))
        print("%s实现晾干%s" % (self.name, clothes))

    def cooking(self,vegetables):
        print("%s实现了买%s的功能" % (self.name, vegetables))
        print("%s实现了洗%s的功能" % (self.name, vegetables))
        print("%s实现了切%s的功能" % (self.name, vegetables))
        print("%s实现了炒%s的功能" % (self.name,vegetables))
        print("%s实现了放调料料的功能" % self.name)

    #pi*r平方
    def Calculated_area(self,radius):
        area=math.pi * radius ** 2
        print("%s计算圆的面积为%d" % (self._name,area))

    def encryption(self,password):
        _md5 = hashlib.md5()
        _md5.update(password.encode("utf-8"))
        p_md5 = _md5.hexdigest()
        print(p_md5)
        #print(f"md5加密后的值为：p_md5")


# 运行哪个py，哪个py的__name__就是__main__
# print(__name__)
if __name__ == '__main__':
    p1=Person("张三", sex='man')
    # p1.chifan()
    # p1.cooking()

    p1.set_age(16)
    print(p1.sex)

    print(p1.washing_clothes())
    # 类加括号，表示实例化对象,对象拥有类的一切方法和属性，
    #p1 = Person("张三")  # p1就是一个叫做张三的人，他拥有洗衣服和做饭的方法,创建对象会自动调用new方法，设置name=张三，会自动调用__init__方法
    # 类是对象的图纸，对象是类的实例
    # 好了，此时一个名字叫做张三的人已经创建好了，那么张三具体是什么呢,Person是一个类（人的模板,图纸），而p1是这个类的实例（根据模板生成具体的某一个人）
    # print(Person)
    # 取消第四行注释
    # print(id(p1))  # 此处我们会发现self的内存地址和p1的内存地址完全一样，因此可以判断self就是p1,并且self.name已经被赋值为“张三”,self也拥有洗衣服和做饭的两种技能

    # 再次看之前的所有需求，就变得非常简化,张三这个名字只需要实例化的时候传一次就可以了,让张三干什么，直接用对象去调用相关的方法即可
    # 解决了oop2中的重复输入人名的问题，同时也可以让该模块很方便的被其他模块引用，详见oop3_1
    p1.cooking("土豆")
    p1.washing_clothes("裤子")